package com.simple.util.api.baidu;

import com.baidu.aip.face.AipFace;
import org.json.JSONArray;
import org.json.JSONObject;

import java.util.HashMap;

/**
 * @program: simple_tools
 * @description:
 * @author: ChenWenLong
 * @create: 2019-12-31 09:56
 **/
public class BaiduAiUtil {

    // 以下内容请在注册百度云之后,在百度云中获取
    private static final String APP_ID = "该内容请在注册百度云之后,在百度云中获取";
    private static final String API_KEY = "该内容请在注册百度云之后,在百度云中获取";
    private static final String SECRET_KEY = "该内容请在注册百度云之后,在百度云中获取";
    private static final String IMAGE_TYPE = "该内容请在注册百度云之后,在百度云中获取";
    private static final String GROUP_ID = "该内容请在注册百度云之后,在百度云中获取";

    private static AipFace client;

    private static HashMap<String, String> options = new HashMap<String, String>();

    public BaiduAiUtil() {
        options.put("quality_control", "NORMAL");
        options.put("liveness_control", "LOW");
    }

    static {
        client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    }

    /**
     * 功能描述:
     * 〈人脸注册 ：将用户照片存入人脸库中〉
     *
     * @params : [userId, image]
     * @return : java.lang.Boolean
     * @author : cwl
     * @date : 2019/12/31 10:00
     */
    public static Boolean faceRegister(String userId, String image) {
        // 人脸注册
        JSONObject res = client.addUser(image, IMAGE_TYPE, GROUP_ID, userId, options);
        Integer errorCode = res.getInt("error_code");
        return errorCode == 0 ? true : false;
    }

    /**
     * 功能描述:
     * 〈人脸更新 ：更新人脸库中的用户照片〉
     *
     * @params : [userId, image]
     * @return : java.lang.Boolean
     * @author : cwl
     * @date : 2019/12/31 10:01
     */
    public static Boolean faceUpdate(String userId, String image) {
        // 人脸更新
        JSONObject res = client.updateUser(image, IMAGE_TYPE, GROUP_ID, userId, options);
        Integer errorCode = res.getInt("error_code");
        return errorCode == 0 ? true : false;
    }

    /**
     * 功能描述:
     * 〈人脸检测：判断上传图片中是否具有面部头像〉
     *
     * @params : [image]
     * @return : java.lang.Boolean
     * @author : cwl
     * @date : 2019/12/31 10:01
     */
    public static Boolean faceCheck(String image) {
        JSONObject res = client.detect(image, IMAGE_TYPE, options);
        if (res.has("error_code") && res.getInt("error_code") == 0) {
            JSONObject resultObject = res.getJSONObject("result");
            Integer faceNum = resultObject.getInt("face_num");
            return faceNum == 1?true:false;
        }else{
            return false;
        }
    }

    /**
     * 功能描述:
     * 〈人脸查找：查找人脸库中最相似的人脸并返回数据〉
     *  处理：用户的匹配得分（score）大于80分，即可认为是同一个用户
     *
     * @params : [image]
     * @return : java.lang.String
     * @author : cwl
     * @date : 2019/12/31 10:01
     */
    public static String faceSearch(String image) {
        JSONObject res = client.search(image, IMAGE_TYPE, GROUP_ID, options);
        if (res.has("error_code") && res.getInt("error_code") == 0) {
            JSONObject result = res.getJSONObject("result");
            JSONArray userList = result.getJSONArray("user_list");
            if (userList.length() > 0) {
                JSONObject user = userList.getJSONObject(0);
                double score = user.getDouble("score");
                if(score > 80) {
                    return user.getString("user_id");
                }
            }
        }
        return null;
    }
}
